/**
 * WAV文件有损压缩与解压缩库
 * 兼容C89/C90标准，适用于单片机环境
 */
#ifndef WAV_CODEC_H
#define WAV_CODEC_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 错误码定义 */
#define WAV_OK           0
#define WAV_ERROR       -1
#define WAV_NO_MEMORY   -2
#define WAV_INVALID_ARG -3
#define WAV_IO_ERROR    -4

/* WAV文件头结构 */
typedef struct {
    char riff_id[4];        /* "RIFF" */
    unsigned int size;      /* 文件总大小-8 */
    char wave_id[4];        /* "WAVE" */
    char fmt_id[4];         /* "fmt " */
    unsigned int fmt_size;  /* 格式块大小 */
    unsigned short format;  /* 格式类型，PCM=1 */
    unsigned short channels; /* 通道数 */
    unsigned int sample_rate; /* 采样率 */
    unsigned int byte_rate;  /* 数据速率 */
    unsigned short block_align; /* 块对齐 */
    unsigned short bits_per_sample; /* 位深度 */
    char data_id[4];        /* "data" */
    unsigned int data_size; /* 数据大小 */
} WAVHeader;

/* 压缩配置 */
typedef struct {
    unsigned int target_sample_rate; /* 目标采样率 */
    unsigned short target_bits;      /* 目标位深度 */
    unsigned char use_adpcm;         /* 是否使用ADPCM编码 */
} CodecConfig;

/**
 * 初始化默认压缩配置
 * @param config 要初始化的配置结构体指针
 */
void codec_init_config(CodecConfig* config);

/**
 * 压缩WAV数据
 * @param in_buffer 输入WAV数据（包含WAV头）
 * @param in_size 输入数据大小
 * @param out_buffer 输出压缩数据的缓冲区
 * @param out_size 输出缓冲区大小，函数返回后更新为实际压缩后的大小
 * @param config 压缩配置
 * @return 错误码：WAV_OK表示成功
 */
int wav_compress(const unsigned char* in_buffer, unsigned int in_size,
                unsigned char* out_buffer, unsigned int* out_size,
                const CodecConfig* config);

/**
 * 解压缩WAV数据
 * @param in_buffer 输入压缩数据
 * @param in_size 输入数据大小
 * @param out_buffer 输出WAV数据的缓冲区（包含WAV头）
 * @param out_size 输出缓冲区大小，函数返回后更新为实际解压后的大小
 * @return 错误码：WAV_OK表示成功
 */
int wav_decompress(const unsigned char* in_buffer, unsigned int in_size,
                  unsigned char* out_buffer, unsigned int* out_size);

/* PCM数据压缩（不包含文件头处理） */
int pcm_compress(const short* in_data, unsigned int in_samples,
                unsigned char* out_buffer, unsigned int* out_size,
                const CodecConfig* config);

/* PCM数据解压缩（不包含文件头处理） */
int pcm_decompress(const unsigned char* in_buffer, unsigned int in_size,
                  short* out_data, unsigned int* out_samples,
                  unsigned char use_adpcm, unsigned short target_bits);

#endif /* WAV_CODEC_H */ 